/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cuadradogenetico;

import org.jgap.FitnessFunction;
import org.jgap.Gene;
import org.jgap.IChromosome;

/**
 *
 * @author Luis Roberto <luis.robertop87@gmail.com>
 * @see Esta clase debe heredar de FitnessFunction de JGAP para lograr tener el metodo evaluate que recibe un cromosoma y le asigna un valor de adaptacion
 * 
 */

public class Adaptacion extends FitnessFunction{
    
    /**
     * @see A partir del numero decimal recuperado por fenotio(int[] sujeto) se evalua la funcion
     * f(x) = x^2 y con ello se obtiene el valor de adaptacion del sujeto
     */
    @Override
    protected double evaluate(IChromosome cr) {
        Gene[] genes = cr.getGenes();  //se obtienen los genes
        int[] bits = new int[genes.length]; // se crea un vector que contendra la informacion genetica
        for (int i = 0; i < bits.length; i++) {
            bits[i] = (int) ((Integer) genes[i].getAllele()); //llenamos el vector con los datos binarios
        }
        return Math.pow(fenotipo(bits), 2); // evaluamos f(x) = x^2
    }
    
    /**
     * @param sujeto que es un vector que contiene numeros binarios que en su conjunto representan al genotipo de un cromosoma
     * este valor debe ser convertido a decimal ya que se espera un vector de longitud N, en resumen este metodo debe recibir un vector
     * de BITS y retorna su valor equivalente en decimal
     * @return decimal: Que es la conversion del cromosoma binario a decimal
     */
    public double fenotipo(int [] sujeto){
        int j = sujeto.length-1;
        double decimal = 0.0;
        for (int i = 0; i < sujeto.length; i++, j--) {
            decimal += sujeto[i]*Math.pow(2, j); 
        }
        return decimal;
    }    
}
